<?php
class Controller_Auth extends Controller_Base {
	public function action() {
		switch($this->arrRequest[1]) {
			case 'vk' :
				// Если залогиненный пользователь пытается авторизоваться через ВКонтакте или в GET нет необходимого параметра - кидаем его на главную
				if(User_Seance::isLogged() || !isset($_GET['code'])) header('Location: ' . W_ABSPATH);
				else $this->tryVkLogin();
				break;
			case 'sign_up':
				$this->actionReg();
				break;
			case 'sign_in':
				$this->actionSignIn();
				break;
			case 'sign_out':
				$this->actionSignOut();
				break;
			default:
				throw new Exception('', 404);
		}
	}
	
	/**
	 * Регистрация пользователя
	 */
	public function actionReg() {
		if (isset($_POST['User_User'])) {
			$objUser = new User_User($_POST['User_User']);
			if($objUser->save()) User_Seance::moveTo(W_ABSPATH);
		}
		else $objUser = new User_User();
		
		$this->title = $this->pageHead = 'Регистрация'; 
		
		$this->showHeader();
			View_Auth::getRegForm($objUser);
		$this->showFooter();
	}
	
	/**
	 * Вход пользователя
	 */
	public function actionSignIn() {
		if(User_Seance::isLogged()) User_Seance::moveTo(W_ABSPATH);
		
		if (isset($_POST['User_User'])) {
			$objUser = new User_User($_POST['User_User']);
			if($objUser->canSignIn()) {
				User_Seance::authorizationIn($objUser);
				User_Seance::moveTo(W_ABSPATH);
			}
		}
		else $objUser = new User_User();
		$this->title = $this->pageHead = 'Авторизация';
	
		$this->showHeader();
			View_Auth::getSignInForm($objUser);
		$this->showFooter();
	}
	
	
	/**
	 * Выход пользователя
	 */
	public function actionSignOut() {
		User_Seance::authorizationOut();
	}
	
	
	public function tryVkLogin() {
		$objDB = Service_Database::instanse();
		$objCurl = new Service_Curl();
		$recievedCode = $_GET['code'];
		
		$url = 'https://oauth.vk.com/access_token';
		$getParametres = array(
						'client_id' => $this->cleintId,
						'client_secret' => $this->secretKey,
						'code' => $recievedCode,
						'redirect_uri' => $this->redirectUrl
		);
		
		$result = json_decode($objCurl->httpRequest('GET', $url, $getParametres, false),true);
		
		if(isset($result['error'])) echo 'error'; 		// Поменять потом. редирект на главную
		else {
			$accessToken = $result['access_token'];
			$userId = $result['user_id'];
			$getParametres = array (
						'uids' => 	$userId,
						'access_token' => $accessToken,
						'fields' => ' uid, first_name, last_name, nickname, sex, bdate, city, country, timezone, photo, photo_medium, photo_big, photo_rec, connections, contacts'		
			);
			$result = json_decode($objCurl->httpRequest('GET', 'https://api.vk.com/method/users.get', $getParametres, false),true);
			
			if(isset($result['error']) || !isset($result['response'][0])) echo 'error';		// Удалённая страница выкинула здесь ошибку
			else {	// Есть неошибочный ответ
				$result = $result['response'][0];
				$firstName = $result['first_name'];
				$lastName = $result['last_name'];
				$vkId = $result['uid'];
				$sex = $result['sex'] ? $result['sex'] : null ;
				
				if(!empty($firstName) && !empty($lastName) && !empty($vkId)) {
					$objUser = new User_User();
					$objUser->find('first', array('conditions' => "`user`.`vk_id`='" . $vkId . "'"));
					if(!$objUser->id) {
						$newUserId = $objDB->insertAutoincrement('user', array('first_name' => $firstName, 'last_name' => $lastName, 'vk_id' => $vkId, 'created_at' => gmdate("Y-m-d H:i:s", time())));
						$objUser = new User_User($newUserId);
					}
					User_Seance::authorizationIn($objUser);
					header('Location: /id' . $objUser->id);
				}
				else echo 'error';
			}
		}
	}
}